package com.wondertek.poms.common.service;

import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Optional;

public interface IService<T, PK> {
	
	/**
	 * <p><b>Title:</b> getOne</p>
	 * <p><b>Description:</b> 通过主键ID查询对象</p>
	 * @author douzi
	 * @param id
	 * @return
	 */
	T get(PK id);
	
	T findById(PK id);
	
	/**
	 * <p><b>Title:</b> findAll</p>
	 * <p><b>Description:</b> 根据条件查询分页数据</p>
	 * @author douzi
	 * @param page 页码
	 * @param rows 条数
	 * @param order 排序列
	 * @param column asc/desc
	 * @return
	 */
	<S extends T> Page<S> findAll(S entity, int page, int rows, String order, String column);
	
	/**
	 * <p><b>Title:</b> findAll</p>
	 * <p><b>Description:</b> 查询全量数据</p>
	 * @author douzi
	 * @return
	 */
	List<T> findAll();
	List<T> findAll(T t);
	List<T> findAll(Example<T> example);
	List<T> findAll(Sort sort);
	List<T> findAll(Example<T> example, Sort sort);
	List<T> findAll(String order, String column);
	List<T> findAll(Example<T> example, String order, String column);
	List<T> findAll(T t, String order, String column);
	Page<T> findAll(Pageable p);
	Page<T> findAll(int page, int rows);
	Page<T> findAll(int page, int rows, String order, String column);
	
	Optional<T> findOne(Example<T> example);
	T findOne(T t);
	T findModel(PK id);
	
	/**
	 * <p><b>Title:</b> deleteById</p>
	 * <p><b>Description:</b> 根据传入主键删除对象</p>
	 * @author douzi
	 * @param id
	 */
	void deleteById(PK id);
	
	/**
	 * <p><b>Title:</b> deleteLogic</p>
	 * <p><b>Description:</b> 逻辑删除</p>
	 * @author douzi
	 * @param id
	 */
	T deleteLogic(PK id);
	
	/**
	 * <p><b>Title:</b> save</p>
	 * <p><b>Description:</b> 保存传入对象</p>
	 * @author douzi
	 * @param entity
	 * @return
	 */
	T save(T entity);
	
	<S extends T> List<S> saveAll(Iterable<S> entities);
//	<S extends T> Iterable<S> batchSave(Iterable<S> entities);
//	<S extends T> Iterable<S> batchUpdate(Iterable<S> entities);
	
	/**
	 * <p><b>Title:</b> merge</p>
	 * <p><b>Description:</b> 更新对象</p>
	 * @author douzi
	 * @param model
	 */
	T merge(T model);
	
}
